昨天我們用 Docker Compose 成功讓「API + PostgreSQL」同時啟動。
今天要更進一步 ——
讓 Todo API 真正連上容器裡的資料庫,
把 Prisma 改成用 PostgreSQL,而不是之前的 SQLite。
今天的目標是:
讓兩者真的「連線起來」。
換句話說,今天我們要做到這件事👇
🧩 Express → Prisma → PostgreSQL(容器)
先打開專案裡的 prisma/schema.prisma,
原本應該長這樣(使用 SQLite):
datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}
我們改成使用 PostgreSQL 👇
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
.env在專案根目錄 .env 檔設定以下內容:
DATABASE_URL="postgresql://postgres:password@db:5432/todo"
⚠️ 注意:這裡的
db是 Compose 裡服務名稱,不是localhost!
Compose 會自動建立虛擬網路,api可以直接用db當主機名。
進入 API 容器,執行 migrate:
docker compose exec api npx prisma migrate dev --name init
輸出類似:
Applying migration `20251013_init`
The database is now in sync with your Prisma schema.
再用 Prisma Studio 看看資料:
docker compose exec api npx prisma studio
打開瀏覽器 → http://localhost:5555
就能看到你熟悉的 Todo 資料表介面了 👏
如果還沒有,請確認你的 schema 裡至少有一個 Todo 模型:
model Todo {
  id        Int      @id @default(autoincrement())
  task      String
  done      Boolean  @default(false)
  note      String?
  createdAt DateTime @default(now())
}
重新啟動整個 Compose:
docker compose down
docker compose up --build -d
查看日誌:
docker compose logs -f api
應該會看到:
🚀 Server running on http://localhost:3000
Connected to PostgreSQL via Prisma
curl -X POST http://localhost:3000/todos \
  -H "Content-Type: application/json" \
  -d '{"task":"Docker 整合測試"}'
回應:
{
  "id": 1,
  "task": "Docker 整合測試",
  "done": false,
  "createdAt": "2025-10-13T10:00:00Z"
}
curl http://localhost:3000/todos
回傳:
[
  {
    "id": 1,
    "task": "Docker 整合測試",
    "done": false
  }
]
🎉 這代表你的 API 已經成功連上容器裡的 PostgreSQL!
就算你停掉整個 Compose,資料也會保留在 volume 裡。
docker compose down
docker compose up -d
重新查詢:
curl http://localhost:3000/todos
資料還在 ✅
這就是 Volume 的威力。
如果你想直接進入資料庫看看:
docker compose exec db psql -U postgres -d todo
輸入:
\d
SELECT * FROM "Todo";
你會看到 Prisma 創建的資料表與內容。
現在的專案已經變成這樣👇
ts-todo-api/
├─ src/
│  ├─ controllers/
│  ├─ services/
│  ├─ routes/
│  ├─ dto/
│  └─ index.ts
├─ prisma/
│  ├─ schema.prisma
│  └─ migrations/
├─ Dockerfile
├─ docker-compose.yml
├─ package.json
└─ .env
用一行指令即可啟動整個完整後端環境:
docker compose up -d
今天是整個 Docker 系列裡的一個「連線時刻」。
我終於讓我的 Express + Prisma + PostgreSQL
全部在容器中互通,完全沒有碰主機環境。
重點收穫:
這次練習讓我更確信 Docker 的威力:
不只是「能跑」,而是「能快速重建整個環境」。